/*-------------------------------------------------------------------------
 *
 * deparse_seclabel_stmts.c
 *	  All routines to deparse SECURITY LABEL statements.
 *
 * Copyright (c), Citus Data, Inc.
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"

#include "nodes/parsenodes.h"
#include "utils/builtins.h"

#include "distributed/deparser.h"

static void AppendSecLabelStmt(StringInfo buf, SecLabelStmt* stmt);

/*
 * DeparseSecLabelStmt builds and returns a string representing of the
 * SecLabelStmt for application on a remote server.
 */
char* DeparseSecLabelStmt(Node* node)
{
    SecLabelStmt* secLabelStmt = castNode(SecLabelStmt, node);
    StringInfoData buf = {0};
    initStringInfo(&buf);

    AppendSecLabelStmt(&buf, secLabelStmt);

    return buf.data;
}

/*
 * AppendSecLabelStmt generates the string representation of the
 * SecLabelStmt and appends it to the buffer.
 */
static void AppendSecLabelStmt(StringInfo buf, SecLabelStmt* stmt)
{
    appendStringInfoString(buf, "SECURITY LABEL ");

    if (stmt->provider != NULL) {
        appendStringInfo(buf, "FOR %s ", quote_identifier(stmt->provider));
    }

    appendStringInfoString(buf, "ON ");

    switch (stmt->objtype) {
        case OBJECT_ROLE: {
            appendStringInfo(buf, "ROLE %s ", quote_identifier(strVal(stmt->objname)));
            break;
        }

        /* normally, we shouldn't reach this */
        default: {
            ereport(ERROR, (errmsg("unsupported security label statement for"
                                   " deparsing")));
        }
    }

    appendStringInfoString(buf, "IS ");

    if (stmt->label != NULL) {
        appendStringInfo(buf, "%s", quote_literal_cstr(stmt->label));
    } else {
        appendStringInfoString(buf, "NULL");
    }
}
